package net.interneteidee.servizi;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.annotation.XmlTransient;

import net.interneteidee.dao.CategoriaDao;
import net.interneteidee.dao.FamigliaDao;
import net.interneteidee.dao.ProdottoDao;
import net.interneteidee.entity.Categoria;
import net.interneteidee.entity.Famiglia;
import net.interneteidee.entity.Fattura;
import net.interneteidee.entity.Ordine;
import net.interneteidee.entity.Prodotto;


@Path("famiglia")
@Produces( {MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON })
@Consumes( {MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON })
@Stateless
public class ProdottoCategoriaFamigliaService {

	@Inject
	ProdottoDao prodottoDao;
	
	@Inject
	CategoriaDao categoriaDao;
	
	@Inject
	FamigliaDao famigliaDao;
	
	@PersistenceContext(unitName = "primary")
	protected EntityManager entityManager;
	
	//---------------Salvataggio--------------------//
	
	public void addProdotto(Prodotto prodotto){
		if(prodotto.getIdProdotto() == 0)
			prodottoDao.save(prodotto);
		else
			prodottoDao.update(prodotto);
	}
	
	public void addCategoria(Categoria categoria){
		if(categoria.getIdCategoria() == 0)
			categoriaDao.save(categoria);
		else
			categoriaDao.update(categoria);
	}
	
	public void addFamiglia(Famiglia famiglia){
		if(famiglia.getIdFamiglia() == 0)
			famigliaDao.save(famiglia);
		else
			famigliaDao.update(famiglia);
		
	}
	
	//---------------Aggiornamento--------------------//
	
	public void updateProdotto(Prodotto prodotto){
		prodottoDao.update(prodotto);
	}
	
	public void updateCategoria(Categoria categoria){
		categoriaDao.update(categoria);
	}
	
	public void updateFamiglia(Famiglia famiglia){
		famigliaDao.update(famiglia);
	} 
	
	//-------------Eliminazione---------------------//
	public void removeProdotto(Prodotto prodotto){
		prodotto.setAbilitato(false);
		prodottoDao.save(prodotto);
	}
	
	public void removeCategoria(Categoria categoria){
		categoria.setAbilitata(false);
		categoriaDao.save(categoria);
	}
	
	public void removeFamiglia (Famiglia famiglia ){
		famiglia.setAbilitata(false);
		famigliaDao.save(famiglia);
	}
	
	//-------------Ricerche----------------------//
	public List<Prodotto> findAllProdotti(){
		return prodottoDao.findAll();
	}
	
	/**
	 * Controlla se esiste un prodotto con questo codice
	 * @param codiceProdotto
	 * @return
	 */
	public boolean findProdottoByCodice(long codiceProdotto){
		if(prodottoDao.findByCodice("codiceProdotto", codiceProdotto)!=null)
			return true;
		return false;
	}
	
	public List<Prodotto> findProdottiOrdinati(Date dataDa , Date dataA){
		return prodottoDao.findProdottiOrdinati(dataDa,dataA);
	}
	
	public List<Prodotto> findProdottiFatturati(Date dataDa , Date dataA){
		return prodottoDao.findProdottiFatturati(dataDa,dataA);
	}
	
	public List<Categoria> findAllCategorie(){
		return categoriaDao.findAll();
	}
	
	public List<Famiglia> findAllFamiglie(){
		return famigliaDao.findAll();
	}
	
	public Famiglia findFamigliaById(long idFamiglia){
		return famigliaDao.findById(idFamiglia); 
	}
	
	@GET
	@Path("{id}/")
	public Famiglia findOrdineByIdWS(@PathParam("id") Long idOrdine){
		
		
		return famigliaDao.findById(idOrdine);
	}
	
	public Categoria findCategoriaById(long idCategoria){
		return categoriaDao.findById(idCategoria);
	}
	
	public Prodotto findProdottoById(long idProdotto){
		return prodottoDao.findById(idProdotto);
	}
	
	
	
	
	public List<Prodotto>  findProdottiAbilitati(){return null;}
	
	public List<Categoria> findCategorieAbilitate(){return null;}
	
	public List<Famiglia> findFamigliaAbilitata(){return null;}
	
	
	
	public List<Prodotto> prodottiPiuRedditizi(){return null;}
	
	public List<Prodotto> categoriePiuRedditizie(){return null;}
	
	public List<Prodotto> famigliePiuRedditizi(){return null;}
	
	/**
	 * @return tutte quelle fatture che hanno superato il termine di pagamento
	 */
	public List<Fattura> fattureInScadenza(){return null;}
	
	/**
	 * 
	 * @return tutti quegli ordini che dopo un certo numero di giorni ancora non sono stati fatturati
	 */
	public List<Ordine>  ordiniInSospeso(){return null;}
	
}
